﻿Imports System.Data
Imports MetodosComuns
Imports extranet.BC
Imports extranet.BE
Imports System.Collections.Generic

Partial Class AdministracaoAcessos_AdmAcsGrupos
  Inherits System.Web.UI.Page

  Private Const DEBUG As Boolean = False
  ' Inicializar parâmetros da Página
  Private Const TITULO_PAGINA As String = "Grupos do Sistema"
  Private Const TITULO_REGISTROS As String = "GRUPOS CADASTRADOS"
  Private Const TITULO_REGISTRO_DETALHE As String = "DETALHES DO GRUPO"
  Private Const TITULO_REGISTRO_EDICAO As String = "ALTERAR GRUPO"
  Private Const TITULO_REGISTRO_CADASTRO As String = "CADASTRO DE GRUPO"
  Private Const MESSAGE_INSERIDO_COM_SUCESSO As String = "O Grupo do Sistema foi Cadastrado com Sucesso!"
  Private Const MESSAGE_ALTERADO_COM_SUCESSO As String = "O Grupo do Sistema foi Alterado com Sucesso!"
  Private Const MESSAGE_EXCLUIDO_COM_SUCESSO As String = "O Grupo do Sistema foi Excluído com Sucesso!"
  Private Const MESSAGE_ERRO_NA_INSERCAO As String = "Erro na inserção do Registro!."
  Private Const MESSAGE_ERRO_NA_ALTERACAO As String = "Erro na atualização do Registro!."
  Private Const MESSAGE_ERRO_NA_EXCLUSAO As String = "Erro na exclusão do Registro!."

  Private Const SELECAO_TELAS As Integer = 0
  Private Const SELECAO_USUARIOS As Integer = 1

  Private Const ROW_NOME_GRUPO As Integer = 0
  Private Const ROW_DESCRICAO As Integer = 1

  Private Const SORT_INDICE_ARRAY As Integer = 2
  Private Const SORT_REGISTROS As Integer = 0
  Private Const SORT_TELAS As Integer = 1
  Private Const SORT_USUARIOS As Integer = 2

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    '==================       PROCEDIMENTO  PADRÃO  SEGURANÇA     =============================
    Dim objBESeguranca As BESeguranca
    Dim objBEUsuario As BEUsuario = Session("objBEUsuario")
    If IsNothing(objBEUsuario) Then Response.Redirect(TELA_LOGOUT)
    Session("strTela") = MetodosComuns.GetCurrentPageName()
    If Not IsPostBack Then          ' SEGURANÇA
      objBESeguranca = BCSeguranca.SelecionaPermissoes(objBEUsuario.GrupoAcesso, Session("strTela"))
      If Not objBESeguranca.Autorizado Then Response.Redirect(TELA_LOGOUT)
      Session("objBESeguranca") = objBESeguranca
    Else
      objBESeguranca = Session("objBESeguranca")
    End If

    '==================       ALTERAR SE FOR NECESSARIO          ===============================
    If Not IsPostBack Then
      Dim sortExpression(SORT_INDICE_ARRAY) As String
      Dim sortDirection(SORT_INDICE_ARRAY) As String
      Session(Session("strTela") & "_SortExpression") = sortExpression
      Session(Session("strTela") & "_SortDirection") = sortDirection

      lblTituloCadastro.Text = TITULO_PAGINA
      With objBESeguranca
        If Not .Escrita Then btnCadastrar.Visible = False
      End With
      mostraPaineis(ESTADO_INICIAL)
    End If

  End Sub

  Protected Sub mostraMensagemDeErro(ByVal message As String)
    lblErro.Visible = True
    lblErro.Text = message
  End Sub

  Protected Sub mostraPaineis(ByVal estado As Int16, ByVal message As String)
    mostraPaineis(estado)
    lblSucesso.Visible = True
    lblSucesso.Text = message
  End Sub

  Protected Sub mostraPaineisComErro(ByVal estado As Int16, ByVal message As String)
    mostraPaineis(estado)
    lblErro.Visible = True
    lblErro.Text = message
  End Sub

  Protected Sub mostraPaineis(ByVal estado As Int16)
    Dim objBESeguranca As BESeguranca = DirectCast(Session("objBESeguranca"), BESeguranca)
    lblSucesso.Visible = False
    lblErro.Visible = False

    ' SEGURANÇA
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        If Not objBESeguranca.Leitura Then estado = IIf(objBESeguranca.Escrita, ESTADO_CADASTRO, ESTADO_BLOQUEADO)
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
        If Not objBESeguranca.Escrita Then estado = IIf(objBESeguranca.Leitura, ESTADO_LISTA, ESTADO_BLOQUEADO)
    End Select

    ' Set Título do painel
    setTitulo(estado)

    ' Set Indice do Registro selecionado na lista de Registros
    grvRegistros.Enabled = (Not estado = ESTADO_BLOQUEADO)
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        grvRegistros.SelectedIndex = -1
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
        grvRegistros.SelectedIndex = -1
    End Select

    ' Set o estado do Data View
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        dtvRegistro.ChangeMode(DetailsViewMode.ReadOnly)
      Case ESTADO_DETALHE
        dtvRegistro.ChangeMode(DetailsViewMode.ReadOnly)
      Case ESTADO_EDICAO
        dtvRegistro.ChangeMode(DetailsViewMode.Edit)
      Case ESTADO_CADASTRO
        dtvRegistro.ChangeMode(DetailsViewMode.Insert)
    End Select

    ' Mostra Painel segundo o estado
    If Not DEBUG Then
      Select Case estado
        Case ESTADO_BLOQUEADO
          panBuscaRegistro.Visible = False
          pangrvRegistros.Visible = False
          pandtvRegistro.Visible = False
        Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
          panBuscaRegistro.Visible = True
          pangrvRegistros.Visible = True
          pandtvRegistro.Visible = False
        Case ESTADO_DETALHE, ESTADO_EDICAO, ESTADO_CADASTRO
          panBuscaRegistro.Visible = False
          pangrvRegistros.Visible = False
          pandtvRegistro.Visible = True
      End Select
    Else
      panBuscaRegistro.Visible = True
      pangrvRegistros.Visible = True
      pandtvRegistro.Visible = True
    End If

    ' Set Registro(s) segundo o estado
    Session("TelasDeAcesso") = Nothing
    Session("UsuariosDeAcesso") = Nothing
    Session("UsuariosCadastrados") = Nothing
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        mostraRegistros()
      Case ESTADO_DETALHE, ESTADO_EDICAO
        selecionaRegistro()
      Case ESTADO_CADASTRO
        mostraRegistro()
    End Select

    ' Set Focus segundo o Estado
    Select Case estado
      Case ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        scriptManager.SetFocus(txtNome)
      Case ESTADO_DETALHE
      Case ESTADO_EDICAO
      Case ESTADO_CADASTRO
    End Select

  End Sub

  Protected Sub setTitulo(ByVal estado As Int16)
    ' Set Título do painel
    Select Case estado
      Case ESTADO_BLOQUEADO, ESTADO_INICIAL, ESTADO_BUSCA, ESTADO_LISTA
        grvRegistros.Caption = TITULO_REGISTROS
      Case ESTADO_DETALHE
        dtvRegistro.Caption = TITULO_REGISTRO_DETALHE
      Case ESTADO_EDICAO
        dtvRegistro.Caption = TITULO_REGISTRO_EDICAO
      Case ESTADO_CADASTRO
        dtvRegistro.Caption = TITULO_REGISTRO_CADASTRO
    End Select
  End Sub

  Protected Sub btnBuscar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub btnCadastrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCadastrar.Click
    mostraPaineis(ESTADO_CADASTRO)
  End Sub

  Protected Sub grvRegistros_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grvRegistros.PageIndexChanging
    grvRegistros.PageIndex = e.NewPageIndex
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub grvRegistros_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grvRegistros.Sorting
    setSorting(SORT_REGISTROS, e)
    e.Cancel = True
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub grvRegistros_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles grvRegistros.SelectedIndexChanged
    mostraPaineis(ESTADO_DETALHE)
  End Sub

  Protected Sub finalizaConsultaItem(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_LISTA)
  End Sub

  Protected Sub btnAlterar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_EDICAO)
  End Sub

  Protected Sub btnCancelarAlteracao_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_DETALHE)
  End Sub

  Protected Sub btnCancelarCadastro_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    mostraPaineis(ESTADO_INICIAL)
  End Sub

  Protected Property IsEditable() As Boolean
    Get
      Dim strGrupo = grvRegistros.SelectedRow.Cells(0).Text.ToUpper()
      Return Not (strGrupo = "ADMIN" OrElse strGrupo = "TRABALHECONOSCO")
    End Get
    Set(ByVal value As Boolean)
    End Set
  End Property

  Protected Property IsInEditMode() As Boolean
    Get
      Return Not (dtvRegistro.CurrentMode = DetailsViewMode.ReadOnly)
    End Get
    Set(ByVal value As Boolean)
    End Set
  End Property

  Protected Sub dtvRegistro_ModeChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewModeEventArgs) Handles dtvRegistro.ModeChanging
    e.NewMode = dtvRegistro.CurrentMode
  End Sub

  Protected Sub dtvRegistro_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtvRegistro.DataBound
    Dim objBESeguranca As BESeguranca = DirectCast(Session("objBESeguranca"), BESeguranca)
    Dim mc As New MetodosComuns
    grvTelas.EmptyDataText = "Clique no botão para adicionar novas telas de acesso"
    grvTelas.Columns(6).Visible = True
    btnAddTela.Visible = True

    grvUsuarios.EmptyDataText = "Clique no botão para adicionar novos usuários para este grupo de acesso"
    grvUsuarios.Columns(3).Visible = True
    btnAddUsuario.Visible = True

    Select Case dtvRegistro.CurrentMode

      Case DetailsViewMode.Insert         ' MODO de INSERÇÃO
        If Not objBESeguranca.Leitura Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnCancelarCadastro").Visible = False
        scriptManager.SetFocus(dtvRegistro.Rows(0).FindControl("txt_nome"))
        setTitulo(ESTADO_CADASTRO)

      Case DetailsViewMode.Edit           ' MODO de EDIÇÃO
        scriptManager.SetFocus(dtvRegistro.Rows(0).FindControl("txt_nome"))
        setTitulo(ESTADO_EDICAO)

      Case DetailsViewMode.ReadOnly       ' MODO de LEITURA
        With objBESeguranca
          If dtvRegistro.Rows.Count Then
            If Not .Exclusao Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnExcluir").Visible = False
            If Not .Modificacao Then dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnAlterar").Visible = False
          End If
        End With
        If (dtvRegistro.Rows.Count > 0) Then
          scriptManager.SetFocus(dtvRegistro.Rows(dtvRegistro.Rows.Count - 1).FindControl("btnOk"))
        End If
        grvTelas.EmptyDataText = "Não existem registros cadastrados"
        grvTelas.Columns(6).Visible = False
        btnAddTela.Visible = False

        grvUsuarios.EmptyDataText = "Não existem registros cadastrados"
        grvUsuarios.Columns(3).Visible = False
        btnAddUsuario.Visible = False

        setTitulo(ESTADO_DETALHE)

    End Select
  End Sub

  Protected Sub dtvRegistro_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles dtvRegistro.ItemInserting
    If verificaInformacao() AndAlso processaRegistro() Then dtvRegistro_ItemInserted(sender, Nothing)
  End Sub

  Protected Sub dtvRegistro_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles dtvRegistro.ItemInserted
    If e IsNot Nothing Then e.ExceptionHandled = True
    mostraPaineis(ESTADO_INICIAL, MESSAGE_INSERIDO_COM_SUCESSO)
  End Sub

  Protected Sub dtvRegistro_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles dtvRegistro.ItemUpdating
    If verificaInformacao() AndAlso processaRegistro() Then dtvRegistro_ItemUpdated(sender, Nothing)
  End Sub

  Protected Sub dtvRegistro_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) Handles dtvRegistro.ItemUpdated
    Dim strNome As String = txtNome.Text
    If (LocalizaStringsNoTexto(strNome, DirectCast(dtvRegistro.Rows(ROW_NOME_GRUPO).FindControl("txt_nome"), TextBox).Text)) Then
      mostraPaineis(ESTADO_DETALHE, MESSAGE_ALTERADO_COM_SUCESSO)
    Else
      mostraPaineis(ESTADO_LISTA, MESSAGE_ALTERADO_COM_SUCESSO)
    End If
  End Sub

  Protected Sub dtvRegistro_ItemDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewDeleteEventArgs) Handles dtvRegistro.ItemDeleting
    Try
      BCGrupoAcesso.Excluir(New BEGrupoAcesso(Integer.Parse(dtvRegistro.DataKey("IdGrupo"))))
      dtvRegistro_ItemDeleted(sender, Nothing)
    Catch ex As Exception
      mostraPaineisComErro(ESTADO_DETALHE, MESSAGE_ERRO_NA_EXCLUSAO)
    End Try
  End Sub

  Protected Sub dtvRegistro_ItemDeleted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewDeletedEventArgs) Handles dtvRegistro.ItemDeleted
    If e IsNot Nothing Then e.ExceptionHandled = True
    mostraPaineis(ESTADO_LISTA, MESSAGE_EXCLUIDO_COM_SUCESSO)
  End Sub

  Protected Sub mostraRegistros()
    grvRegistros.DataSource = BCGrupoAcesso.Selecionar(txtNome.Text, _
                                                       Session(Session("strTela") & "_SortExpression")(SORT_REGISTROS), _
                                                       Session(Session("strTela") & "_SortDirection")(SORT_REGISTROS))
    grvRegistros.DataBind()
  End Sub

  Protected Sub selecionaRegistro()
    Dim intIdGrupo As Integer = Integer.Parse(grvRegistros.SelectedDataKey("IdGrupo"))
    dtvRegistro.DataSource = BCGrupoAcesso.Selecionar(intIdGrupo)
    dtvRegistro.DataBind()

    Session("TelasDeAcesso") = BCTela.SelecionaPeloGrupoAcesso(intIdGrupo)
    Session("UsuariosDeAcesso") = BCUsuario.SelecionaPeloGrupoAcesso(intIdGrupo)

    mostraRegistro()
  End Sub

  Protected Sub mostraRegistro()
    grvTelas.DataSource = Session("TelasDeAcesso")
    grvTelas.DataBind()
    grvUsuarios.DataSource = Session("UsuariosDeAcesso")
    grvUsuarios.DataBind()
  End Sub

  Protected Function verificaInformacao() As Boolean
    Dim boolProcessa As Boolean = True
    If Not boolProcessa Then
    End If
    Return boolProcessa
  End Function

  Protected Function processaRegistro() As Boolean
    Dim boolInsercao As Boolean = (dtvRegistro.CurrentMode = DetailsViewMode.Insert)
    Dim grupoAcesso As New BEGrupoAcesso()
    Dim booSucesso As Boolean = True
    Dim tela As New BETela()
    Try
      With grupoAcesso
        .IdGrupo = dtvRegistro.DataKey("IdGrupo")
        .Nome = DirectCast(dtvRegistro.Rows(ROW_NOME_GRUPO).FindControl("txt_nome"), TextBox).Text
        .Descricao = DirectCast(dtvRegistro.Rows(ROW_DESCRICAO).FindControl("txt_descricao"), TextBox).Text
        For nI As Integer = 0 To grvTelas.Rows.Count - 1
          tela = New BETela(Integer.Parse(grvTelas.DataKeys(nI)("IdTela")))
          tela.Leitura = DirectCast(grvTelas.Rows(nI).FindControl("cb_Leitura"), CheckBox).Checked
          tela.Escrita = DirectCast(grvTelas.Rows(nI).FindControl("cb_Escrita"), CheckBox).Checked
          tela.Modificacao = DirectCast(grvTelas.Rows(nI).FindControl("cb_Modificacao"), CheckBox).Checked
          tela.Exclusao = DirectCast(grvTelas.Rows(nI).FindControl("cb_Exclusao"), CheckBox).Checked
          .Telas.Add(tela)
        Next
        For nI As Integer = 0 To grvUsuarios.Rows.Count - 1
          .Usuarios.Add(New BEUsuario(grvUsuarios.DataKeys(nI)("Usuario"), Nothing))
        Next
      End With
      If boolInsercao Then
        BCGrupoAcesso.Cadastrar(grupoAcesso)
      Else
        BCGrupoAcesso.Atualizar(grupoAcesso)
      End If
    Catch ex As Exception
      mostraMensagemDeErro(IIf(boolInsercao, MESSAGE_ERRO_NA_INSERCAO, MESSAGE_ERRO_NA_ALTERACAO))
      booSucesso = False
    End Try
    Return booSucesso
  End Function

  '=========****************           PAINEL  DE  SELECAO             ****************=========
  Protected Sub setSelecao(ByVal tipoSelecao As Integer)
    pnlgrvTelasSelecao.Visible = False
    pnlgrvUsuariosSelecao.Visible = False
    Select Case tipoSelecao
      Case SELECAO_TELAS
        With grvTelasSelecao
          .DataSource = BCTela.Selecionar(txtSearchDescricao.Text, txtSearchModulo.Text, _
                                          Session(Session("strTela") & "_SortExpression")(SORT_TELAS), _
                                          Session(Session("strTela") & "_SortDirection")(SORT_TELAS))
          .SelectedIndex = -1
          .DataBind()
        End With
        pnlgrvTelasSelecao.Visible = True
      Case SELECAO_USUARIOS
        Session("UsuariosCadastrados") = BCUsuario.Selecionar(txtSearchNome.Text, _
                                                              Session(Session("strTela") & "_SortExpression")(SORT_USUARIOS), _
                                                              Session(Session("strTela") & "_SortDirection")(SORT_USUARIOS))
        With grvUsuariosSelecao
          .DataSource = Session("UsuariosCadastrados")
          .SelectedIndex = -1
          .DataBind()
        End With
        pnlgrvUsuariosSelecao.Visible = True
    End Select
    upSelecao.Update()
    Session("intSelecao") = tipoSelecao
  End Sub

  '=========****************           SELECAO DE TELAS            ****************=========
  Protected Sub btnAddTela_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddTela.Click
    setSelecao(SELECAO_TELAS)
    mpeSelecao.Show()
  End Sub

  Protected Sub grvTelas_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grvTelas.RowDeleting
    Dim iList As List(Of BETela) = Session("TelasDeAcesso")
    iList.RemoveAt(e.RowIndex)
    grvTelas.DataSource = iList
    grvTelas.DataBind()
  End Sub

  Protected Sub btnBuscarTela_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBuscarTela.Click
    setSelecao(SELECAO_TELAS)
  End Sub

  Protected Sub grvTelasSelecao_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grvTelasSelecao.RowDataBound
    checkRowsTela()
  End Sub

  Protected Sub grvTelasSelecao_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grvTelasSelecao.PageIndexChanging
    grvTelasSelecao.PageIndex = e.NewPageIndex
    setSelecao(SELECAO_TELAS)
  End Sub

  Protected Sub grvTelasSelecao_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grvTelasSelecao.Sorting
    setSorting(SORT_TELAS, e)
    e.Cancel = True
    setSelecao(SELECAO_TELAS)
  End Sub

  Protected Sub grvTelasSelecao_SelectedIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSelectEventArgs) 'Handles grvTelasSelecao.SelectedIndexChanging
    Dim nI As Integer = 0, nRowIndex As Integer = -1
    Dim Chk As CheckBox = sender
    'Dim objTable As DataTable = DirectCast(Session("dsTaxa"), Taxa).tabelaTaxa_Projeto()
    Dim oRow As GridViewRow = Chk.Parent.Parent
    Dim nIdRegistro As Integer = grvTelasSelecao.DataKeys(oRow.RowIndex).Value

    'For nI = 0 To objTable.Rows.Count - 1
    '  If Not objTable.Rows(nI).RowState = DataRowState.Deleted Then
    '    If objTable.Rows(nI)(0) = nIdRegistro Then
    '      nRowIndex = nI
    '      Exit For
    '    End If
    '  End If
    'Next
    'If Chk.Checked Then
    '  If nRowIndex < 0 Then
    '    Dim atributo As DataRow = objTable.NewRow()
    '    atributo("id_projeto") = nIdRegistro
    '    atributo("numero_projeto") = oRow.Cells(2).Text
    '    atributo("projeto") = Server.HtmlDecode(oRow.Cells(3).Text)
    '    addProjeto(atributo)
    '  End If
    'ElseIf nRowIndex >= 0 Then
    '  '      deleteProjeto(nRowIndex)
    'End If
  End Sub

  Protected Sub checkRowsTela()
    Dim nI As Integer = 0, nJ As Integer = 0
    Dim objGridSelected As GridView = grvTelas
    Dim objGridSelecao As GridView = grvTelasSelecao
    Dim chkName As String = "chkSelectTela"
    For nI = 0 To objGridSelecao.Rows.Count - 1
      Dim objCBSelecao As CheckBox = objGridSelecao.Rows(nI).FindControl(chkName)
      objCBSelecao.Checked = False
      For Each objDKSelected As DataKey In objGridSelected.DataKeys
        If objGridSelecao.DataKeys(nI)("IdTela") = objDKSelected("IdTela") Then
          objCBSelecao.Checked = True
          Exit For
        End If
      Next
    Next
    upSelecao.Update()
  End Sub

  Protected Sub chkSelectTela_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim iList As New List(Of BETela)
    Dim nRowIndex As Integer = -1
    Dim Chk As CheckBox = sender
    Dim oRow As GridViewRow = Chk.Parent.Parent
    Dim nIdRegistro As Integer = grvTelasSelecao.DataKeys(oRow.RowIndex).Value

    If Session("TelasDeAcesso") IsNot Nothing Then
      iList = Session("TelasDeAcesso")
      For nI As Integer = 0 To iList.Count - 1
        If iList(nI).IdTela = nIdRegistro Then
          If Not Chk.Checked Then iList.RemoveAt(nI)
          nRowIndex = nI
          Exit For
        End If
      Next
    End If
    If Chk.Checked AndAlso nRowIndex < 0 Then
      iList.Add(New BETela(nIdRegistro, Nothing, _
                           Server.HtmlDecode(oRow.Cells(1).Text), _
                           Server.HtmlDecode(oRow.Cells(2).Text)))
    End If
    Session("TelasDeAcesso") = iList
    grvTelas.DataSource = Session("TelasDeAcesso")
    grvTelas.DataBind()
  End Sub

  '=========****************           SELECAO DE USUARIOS           ****************=========
  Protected Sub btnAddUsuario_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddUsuario.Click
    setSelecao(SELECAO_USUARIOS)
    mpeSelecao.Show()
  End Sub

  Protected Sub btnBuscarUsuario_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBuscarUsuario.Click
    setSelecao(SELECAO_USUARIOS)
  End Sub

  Protected Sub grvUsuariosSelecao_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles grvUsuariosSelecao.DataBound
    checkRowsUsuario()
  End Sub

  Protected Sub grvUsuarios_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grvUsuarios.RowDeleting
    Dim iList As List(Of BEUsuario) = Session("UsuariosDeAcesso")
    iList.RemoveAt(e.RowIndex)
    grvUsuarios.DataSource = iList
    grvUsuarios.DataBind()
  End Sub

  Protected Sub grvUsuariosSelecao_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles grvUsuariosSelecao.PageIndexChanging
    grvUsuariosSelecao.PageIndex = e.NewPageIndex
    setSelecao(SELECAO_USUARIOS)
  End Sub

  Protected Sub grvUsuariosSelecao_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grvUsuariosSelecao.Sorting
    setSorting(SORT_USUARIOS, e)
    e.Cancel = True
    setSelecao(SELECAO_USUARIOS)
  End Sub

  Protected Sub checkRowsUsuario()
    Dim nI As Integer = 0, nJ As Integer = 0
    Dim objGridSelected As GridView = grvUsuarios
    Dim objGridSelecao As GridView = grvUsuariosSelecao
    Dim chkName As String = "chkSelectUsuario"
    For nI = 0 To objGridSelecao.Rows.Count - 1
      Dim objCBSelecao As CheckBox = objGridSelecao.Rows(nI).FindControl(chkName)
      objCBSelecao.Checked = False
      For Each objDKSelected As DataKey In objGridSelected.DataKeys
        If objGridSelecao.DataKeys(nI)("Usuario") = objDKSelected("Usuario") Then
          objCBSelecao.Checked = True
          Exit For
        End If
      Next
    Next
    upSelecao.Update()
  End Sub

  Protected Sub chkSelectUsuario_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim iList As New List(Of BEUsuario)
    Dim nRowIndex As Integer = -1
    Dim Chk As CheckBox = sender
    Dim oRow As GridViewRow = Chk.Parent.Parent
    Dim strRegistro As String = grvUsuariosSelecao.DataKeys(oRow.RowIndex).Value

    If Session("UsuariosDeAcesso") IsNot Nothing Then
      iList = Session("UsuariosDeAcesso")
      For nI As Integer = 0 To iList.Count - 1
        If iList(nI).Usuario = strRegistro Then
          If Not Chk.Checked Then iList.RemoveAt(nI)
          nRowIndex = nI
          Exit For
        End If
      Next
    End If
    If Chk.Checked AndAlso nRowIndex < 0 Then
      Dim objUsuarios As List(Of BEUsuario) = Session("UsuariosCadastrados")
      Dim usuario As BEUsuario = New BEUsuario(strRegistro, "")
      usuario.Nome = Server.HtmlDecode(oRow.Cells(1).Text)
      usuario.Franquia = objUsuarios(oRow.RowIndex).Franquia
      usuario.Cidade = Server.HtmlDecode(oRow.Cells(3).Text)
      iList.Add(usuario)
    End If
    Session("UsuariosDeAcesso") = iList
    grvUsuarios.DataSource = Session("UsuariosDeAcesso")
    grvUsuarios.DataBind()
  End Sub

  '=========****************                                     ****************=========

  Protected Sub setSorting(ByVal intTipo As Integer, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs)
    If (Session(Session("strTela") & "_SortExpression")(intTipo) Is Nothing OrElse _
        Session(Session("strTela") & "_SortDirection")(intTipo) Is Nothing OrElse _
        Session(Session("strTela") & "_SortExpression")(intTipo) <> e.SortExpression OrElse _
        Session(Session("strTela") & "_SortDirection")(intTipo) = "DESC") Then
      Session(Session("strTela") & "_SortDirection")(intTipo) = "ASC"
    ElseIf Session(Session("strTela") & "_SortDirection")(intTipo) = "ASC" Then
      Session(Session("strTela") & "_SortDirection")(intTipo) = "DESC"
    End If
    Session(Session("strTela") & "_SortExpression")(intTipo) = e.SortExpression
  End Sub

End Class
